/** @file
  data types that are used by editor
  
  Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef _HEDITOR_TYPE_H_
#define _HEDITOR_TYPE_H_

#include "UefiShellDebug1CommandsLib.h"
#include "EditTitleBar.h"

#define EFI_EDITOR_LINE_LIST  SIGNATURE_32 ('e', 'e', 'l', 'l')

#define ASCII_POSITION        ((0x10 * 3) + 12)


typedef struct {
  UINTN Row;
  UINTN Column;
} HEFI_EDITOR_POSITION;

typedef
EFI_STATUS
(*HEFI_MENU_ITEM_FUNCTION) (
  VOID
  );

typedef struct {
  CHAR16                  Name[50];
  CHAR16                  Key[3];
  HEFI_MENU_ITEM_FUNCTION Function;
} HMENU_ITEMS;

typedef struct _HEFI_EDITOR_LINE {
  UINTN           Signature;
  UINT8           Buffer[0x10];
  UINTN           Size;                             // unit is Unicode
  LIST_ENTRY  Link;
} HEFI_EDITOR_LINE;

typedef struct _HEFI_EDITOR_MENU_ITEM {
  CHAR16                  NameToken;
  CHAR16                  FunctionKeyToken;
  HEFI_MENU_ITEM_FUNCTION Function;
} HEFI_EDITOR_MENU_ITEM;

typedef struct {
  UINT32  Foreground : 4;
  UINT32  Background : 4;
} HEFI_EDITOR_COLOR_ATTRIBUTES;

typedef union {
  HEFI_EDITOR_COLOR_ATTRIBUTES  Colors;
  UINTN                         Data;
} HEFI_EDITOR_COLOR_UNION;

typedef struct {
  UINTN Columns;
  UINTN Rows;
} HEFI_EDITOR_TEXT_MODE;


typedef struct {
  CHAR16  *Name;

  UINTN   BlockSize;
  UINTN   Size;
  UINTN   Offset;
} HEFI_EDITOR_DISK_IMAGE;

typedef struct {
  EFI_CPU_IO2_PROTOCOL *IoFncs;
  UINTN                Offset;
  UINTN                Size;
} HEFI_EDITOR_MEM_IMAGE;

typedef struct {
  CHAR16  *FileName;
  UINTN   Size;                                     // file size
  BOOLEAN ReadOnly;                                 // file is read-only or not
} HEFI_EDITOR_FILE_IMAGE;

typedef struct {
  LIST_ENTRY                      *ListHead;        // list head of lines
  HEFI_EDITOR_LINE                *Lines;           // lines of current file
  UINTN                           NumLines;         // number of lines
  HEFI_EDITOR_LINE                *CurrentLine;     // current line cursor is at
  HEFI_EDITOR_POSITION            DisplayPosition;  // cursor position in screen
  HEFI_EDITOR_POSITION            MousePosition;    // mouse position in screen
  HEFI_EDITOR_POSITION            BufferPosition;   // cursor position in buffer
  UINTN                           LowVisibleRow;    // the lowest visible row of file position
  BOOLEAN                         HighBits;         // cursor is at the high4 bits or low4 bits
  BOOLEAN                         Modified;         // BUFFER is modified or not
  EDIT_FILE_TYPE                  BufferType;

  HEFI_EDITOR_FILE_IMAGE          *FileImage;
  HEFI_EDITOR_DISK_IMAGE          *DiskImage;
  HEFI_EDITOR_MEM_IMAGE           *MemImage;

} HEFI_EDITOR_BUFFER_IMAGE;

typedef struct {
  HEFI_EDITOR_BUFFER_IMAGE          *BufferImage;

  HEFI_EDITOR_COLOR_UNION           ColorAttributes;
  HEFI_EDITOR_POSITION              ScreenSize;           // row number and column number
  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInputEx;
  BOOLEAN                           MouseSupported;
  EFI_SIMPLE_POINTER_PROTOCOL       *MouseInterface;
  INT32                             MouseAccumulatorX;
  INT32                             MouseAccumulatorY;

  UINTN                             SelectStart;          // starting from 1
  UINTN                             SelectEnd;            // starting from 1
} HEFI_EDITOR_GLOBAL_EDITOR;

#endif
